package br.com.foxinline.manager.utilitario;

import br.com.foxinline.modelo.Aforamento;
import br.com.foxinline.modelo.Grupo;
import br.com.foxinline.modelo.Usuario;
import br.com.foxinline.servico.AforamentoServico;
import br.com.foxinline.servico.GrupoServico;
import br.com.foxinline.servico.UsuarioServico;
import br.com.foxinline.vo.LivroVO;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import org.primefaces.model.chart.CartesianChartModel;
import org.primefaces.model.chart.ChartSeries;

/**
 *
 * @author laverson
 */
@ViewScoped
@ManagedBean
public class ManagerRelatorioCadastroAforamento {

    @EJB
    AforamentoServico aforamentoServico;
    @EJB
    UsuarioServico usuarioServico;
    @EJB
    GrupoServico grupoServico;
    private Usuario usuario;
    private List<Usuario> usuarios;
    private String livro;
    private Usuario usuarioDetalhe;
    private String livroDetalhe;
    private Grupo grupo;
    private Date dataInicial;

    @PostConstruct
    public void init() {
        this.usuario = new Usuario();

        this.grupo = grupoServico.find(5L);

        this.usuario.setGrupos(new ArrayList<Grupo>());
        this.usuario.getGrupos().add(this.grupo);

        this.dataInicial = new Date();

        this.usuarios = usuarioServico.find(this.usuario, null, null);
    }

    public List<LivroVO> livro(Usuario usuario) {
        List<String> numeroLivros = aforamentoServico.numeroLivros(usuario);
        List<LivroVO> livros = new ArrayList<LivroVO>();
        LivroVO livroVO;

        for (String numeroLivro : numeroLivros) {
            livroVO = new LivroVO();
            livroVO.setLivro(numeroLivro);
            livroVO.setQuantidadeFolhas(aforamentoServico.quantidadeFolhaLivro(numeroLivro, usuario));

            livros.add(livroVO);
        }

        return livros;
    }

    public List<Aforamento> numeroCartasLivro() {
        return aforamentoServico.porLivroUsuario(this.livroDetalhe, this.usuarioDetalhe);
    }

    public void pesquisar() {
        if (this.livro != null && !this.livro.isEmpty()) {
            Aforamento aforamento = new Aforamento();
            aforamento.setLivro(this.livro);

            if (this.usuario != null && this.usuario.getId() != null) {
                aforamento.setCriadoPor(this.usuario);
            }

            usuarios = aforamentoServico.usuarios(aforamento);

        } else if (this.usuario != null) {
            this.usuarios = usuarioServico.find(this.usuario, null, null);
        } else {
            init();
        }
    }

    public void limpar() {
        init();
    }

    public List<Usuario> autocompleteUsuario(String query) {
        List<Usuario> result = new ArrayList<Usuario>();

        for (Usuario u : usuarioServico.autocomplete(query)) {
            if (u.getGrupos().contains(this.grupo)) {
                result.add(u);
            }
        }

        return result;
    }

    public CartesianChartModel criarGraficoCadastro() {
        CartesianChartModel categoryModel = new CartesianChartModel();

        Aforamento aforamento = new Aforamento();
        aforamento.setCriadoPor(this.usuarioDetalhe);

        ChartSeries livros = new ChartSeries();
        livros.setLabel("Aforamentos");

        Calendar calendar = Calendar.getInstance();
        calendar.setTime(this.dataInicial);

        int dia;

        if (calendar.get(Calendar.MONTH) == Calendar.getInstance().get(Calendar.MONTH)
                && calendar.get(Calendar.YEAR) == Calendar.getInstance().get(Calendar.YEAR)) {

            dia = calendar.get(Calendar.DAY_OF_MONTH);
        } else {
            dia = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
        }

        Long quantidade;

        for (int i = 1; i <= dia; i++) {

            calendar.set(Calendar.DATE, i);
            quantidade = aforamentoServico.quantidadePorUsuarioEDia(this.usuarioDetalhe, calendar.getTime());

            livros.set(i + "", quantidade.longValue());
        }

        categoryModel.addSeries(livros);

        return categoryModel;
    }

    public Usuario getUsuario() {
        return usuario;
    }

    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
    }

    public String getLivro() {
        return livro;
    }

    public void setLivro(String livro) {
        this.livro = livro;
    }

    public List<Usuario> getUsuarios() {
        return usuarios;
    }

    public void setUsuarios(List<Usuario> usuarios) {
        this.usuarios = usuarios;
    }

    public Usuario getUsuarioDetalhe() {
        return usuarioDetalhe;
    }

    public void setUsuarioDetalhe(Usuario usuarioDetalhe) {
        this.usuarioDetalhe = usuarioDetalhe;
    }

    public String getLivroDetalhe() {
        return livroDetalhe;
    }

    public void setLivroDetalhe(String livroDetalhe) {
        this.livroDetalhe = livroDetalhe;
    }

    public Date getDataInicial() {
        return dataInicial;
    }

    public void setDataInicial(Date dataInicial) {
        this.dataInicial = dataInicial;
    }
}
